åé¢ããããŠããããã¹ãã§ããã³ããšã³ãã³ã³ããŒãã³ããã¹ãããã¹ã¿ãŒããŸããããã°ããŒãã«ãªã³ã³ããã¹ãã§å ç¢ã§ä¿¡é Œæ§ã®é«ããä¿å®å¯èœãªUIãæ§ç¯ããããã®æŠç¥ããã¹ããã©ã¯ãã£ã¹ãããŒã«ãåŠã³ãŸãã
ããã³ããšã³ãã³ã³ããŒãã³ããã¹ãïŒã°ããŒãã«ããŒã ã®ããã®åé¢ããããŠããããã¹ãæŠç¥
çŸä»£ã®ããã³ããšã³ãéçºã®äžçã§ã¯ãå ç¢ã§ä¿å®å¯èœããã€ä¿¡é Œæ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããšãæãéèŠã§ããã¢ããªã±ãŒã·ã§ã³ããŸããŸãè€éã«ãªããããŒã ãããã°ããŒãã«ã«åæ£ããã«ã€ããŠã广çãªãã¹ãæŠç¥ã®å¿ èŠæ§ãé£èºçã«é«ãŸã£ãŠããŸãããã®èšäºã§ã¯ãããã³ããšã³ãã³ã³ããŒãã³ããã¹ãã®é åãæ·±ãæãäžããç¹ã«ã°ããŒãã«ããŒã ãé«å質ã®ãœãããŠã§ã¢ãæ§ç¯ã§ããããã«ããåé¢ããããŠããããã¹ãæŠç¥ã«çŠç¹ãåœãŠãŠããŸãã
ã³ã³ããŒãã³ããã¹ããšã¯äœã§ããïŒ
ã³ã³ããŒãã³ããã¹ãã¯ããã®æ žå¿ã«ãããŠãåã ã®UIã³ã³ããŒãã³ãã®æ©èœãåé¢ããŠæ€èšŒãããã©ã¯ãã£ã¹ã§ããã³ã³ããŒãã³ãã¯ãåçŽãªãã¿ã³ããè€éãªããŒã¿ã°ãªãããŸã§ããããããã®ã«ãªãåŸãŸããéèŠãªã®ã¯ããããã®ã³ã³ããŒãã³ããã¢ããªã±ãŒã·ã§ã³ã®æ®ãã®éšåããç¬ç«ããŠãã¹ãããããšã§ãããã®ã¢ãããŒãã«ãããéçºè ã¯æ¬¡ã®ããšãå¯èœã«ãªããŸãã
- ãã°ãæ©æã«ç¹å®ããŠä¿®æ£ããïŒ ã³ã³ããŒãã³ããåé¢ããŠãã¹ãããããšã§ãæ¬ é¥ãéçºã©ã€ããµã€ã¯ã«ã®æ©ã段éã§æ€åºãã解決ããããšãã§ããŸããããã«ãããåŸã§ä¿®æ£ããããã®ã³ã¹ããšåŽåã軜æžãããŸãã
- ã³ãŒãå質ã®åäžïŒ ã³ã³ããŒãã³ããã¹ãã¯ãåã³ã³ããŒãã³ãã®æåŸ ãããåäœã瀺ãçããããã¥ã¡ã³ããšããŠæ©èœããããåªããã³ãŒãèšèšãä¿é²ããŸãã
- 倿Žã«å¯Ÿããä¿¡é Œæ§ã®åäžïŒ å æ¬çãªã³ã³ããŒãã³ããã¹ãã¹ã€ãŒãã¯ãã³ãŒãããŒã¹ã«å€æŽãå ããéã«ãæ¢åã®æ©èœãæãªãããªãããšãä¿èšŒããä¿¡é Œæ§ãæäŸããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®ä¿é²ïŒ é©åã«å®çŸ©ãããã³ã³ããŒãã³ããã¹ãã«ããããªã°ã¬ãã·ã§ã³ã®çºçãæããããšãªããã³ãŒããããç°¡åã«ãªãã¡ã¯ã¿ãªã³ã°ã§ããŸãã
- 䞊è¡éçºã®å®çŸïŒ ããŒã ã¯ãäºãã«å¹²æžããããšãªããç°ãªãã³ã³ããŒãã³ããåæã«äœæ¥ã§ãããããéçºããã»ã¹ãå éãããŸããããã¯ãç°ãªãã¿ã€ã ãŸãŒã³ã§äœæ¥ããã°ããŒãã«ã«åæ£ããããŒã ã«ãšã£ãŠç¹ã«éèŠã§ãã
ãªãåé¢ããããŠããããã¹ããªã®ãïŒ
ããŸããŸãªãã¹ãã¢ãããŒãïŒãšã³ãããŒãšã³ããçµ±åãããžã¥ã¢ã«ãªã°ã¬ãã·ã§ã³ïŒãååšããäžæ¹ã§ãåé¢ããããŠããããã¹ãã¯ãç¹ã«è€éãªããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãç¬èªã®å©ç¹ãæäŸããŸããããããããã䟡å€ã®ããæŠç¥ã§ããçç±ã§ãã
- åäžè²¬ä»»ãžã®éäžïŒ åé¢ããããã¹ãã¯ãåã³ã³ããŒãã³ãã®åäžè²¬ä»»ã«ã€ããŠèããããšã匷å¶ããŸããããã«ãããã¢ãžã¥ãŒã«æ§ãšä¿å®æ§ãåäžããŸãã
- ããé«éãªãã¹ãå®è¡ïŒ åé¢ããããã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåãžã®äŸåé¢ä¿ããªããããéåžžãçµ±åãã¹ããŸãã¯ãšã³ãããŒãšã³ããã¹ããããå®è¡ãã¯ããã«é«éã§ãããã®è¿ éãªãã£ãŒãããã¯ã«ãŒãã¯ãå¹ççãªéçºã«äžå¯æ¬ ã§ãã
- æ£ç¢ºãªãšã©ãŒã®ããŒã«ã©ã€ãºïŒ ãã¹ãã倱æããå Žåãã©ã®ã³ã³ããŒãã³ããåé¡ã®åå ã§ããããæ£ç¢ºã«ææ¡ã§ããããããããã°ãå€§å¹ ã«å®¹æã«ãªããŸãã
- äŸåé¢ä¿ã®ã¢ãã¯ïŒ åé¢ã¯ãã³ã³ããŒãã³ããäŸåããäŸåé¢ä¿ãã¢ãã¯ãŸãã¯ã¹ã¿ãã¢ãŠãããããšã«ãã£ãŠå®çŸãããŸããããã«ãããã³ã³ããŒãã³ãã®ç°å¢ãå¶åŸ¡ããã¢ããªã±ãŒã·ã§ã³å šäœãèšå®ããè€éããªãã«ãç¹å®ã®ã·ããªãªããã¹ãã§ããŸãã
ã¯ãªãã¯æã«APIãããŠãŒã¶ãŒããŒã¿ããã§ãããããã¿ã³ã³ã³ããŒãã³ããèããŠã¿ãŸããããåé¢ããããŠããããã¹ãã§ã¯ãAPIåŒã³åºããã¢ãã¯ããŠç¹å®ã®ããŒã¿ãè¿ããå®éã«ãããã¯ãŒã¯ãªã¯ãšã¹ããè¡ããã«ããã¿ã³ããŠãŒã¶ãŒæ å ±ãæ£ãã衚瀺ããããšã確èªããŸããããã«ãããå€éšäŸåé¢ä¿ã®å€åæ§ãšæœåšçãªä¿¡é Œæ§ã®äœäžãæé€ãããŸãã
广çãªåé¢ããããŠããããã¹ãã®ããã®æŠç¥
åé¢ããããŠããããã¹ãã广çã«å®è£ ããã«ã¯ãæ éãªèšç»ãšå®è¡ãå¿ èŠã§ããèæ ®ãã¹ãäž»èŠãªæŠç¥ã次ã«ç€ºããŸãã
1. é©åãªãã¹ããã¬ãŒã ã¯ãŒã¯ã®éžæ
é©åãªãã¹ããã¬ãŒã ã¯ãŒã¯ãéžæããããšã¯ãã³ã³ããŒãã³ããã¹ãæŠç¥ãæåãããããã«éåžžã«éèŠã§ããããã€ãã®äžè¬çãªãªãã·ã§ã³ããããããããã«ç¬èªã®é·æãšçæããããŸããæ±ºå®ãäžãéã«ã¯ã次ã®èŠçŽ ãèæ ®ããŠãã ããã
- èšèªãšãã¬ãŒã ã¯ãŒã¯ã®äºææ§ïŒ ããã³ããšã³ããã¯ãããžãŒã¹ã¿ãã¯ïŒReactãVueãAngularãªã©ïŒãšã·ãŒã ã¬ã¹ã«çµ±åãããã¬ãŒã ã¯ãŒã¯ãéžæããŸãã
- 䜿ããããïŒ ãã¬ãŒã ã¯ãŒã¯ã¯ãæç¢ºãªããã¥ã¡ã³ããšãµããŒãã³ãã¥ããã£ãåããç¿åŸãšäœ¿çšã容æã§ããå¿ èŠããããŸãã
- ã¢ãã¯æ©èœïŒ ã³ã³ããŒãã³ããäŸåé¢ä¿ããåé¢ããã«ã¯ãå ç¢ãªã¢ãã¯æ©èœãäžå¯æ¬ ã§ãã
- ã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªïŒ ãã¬ãŒã ã¯ãŒã¯ã¯ãæåŸ ãããåäœãæ€èšŒããããã®åŒ·åãªã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªãæäŸããå¿ èŠããããŸãã
- ã¬ããŒããšçµ±åïŒ è©³çŽ°ãªãã¹ãã¬ããŒãããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã·ã¹ãã ãšã®çµ±åãªã©ã®æ©èœãæ¢ããŸãã
äžè¬çãªãã¬ãŒã ã¯ãŒã¯ïŒ
- JestïŒ Facebookãéçºãããåºã䜿çšãããŠããJavaScriptãã¹ããã¬ãŒã ã¯ãŒã¯ã䜿ãããããçµã¿èŸŒã¿ã®ã¢ãã¯æ©èœãããã³åªããããã©ãŒãã³ã¹ã§ç¥ãããŠããŸããReactãããžã§ã¯ãã§äžè¬çãªéžæè¢ã§ãããä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã䜿çšã§ããŸãã
- MochaïŒ ããŸããŸãªã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªãšã¢ãã¯ããŒã«ããµããŒããããæè»ã§çšéã®åºããã¹ããã¬ãŒã ã¯ãŒã¯ãChaiïŒã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªïŒããã³Sinon.JSïŒã¢ãã¯ã©ã€ãã©ãªïŒãšçµã¿åãããŠäœ¿çšââãããããšããããããŸãã
- JasmineïŒ ãã¹ããäœæããããã®ã¯ãªãŒã³ã§èªã¿ãããæ§æãæäŸãããããã€ãã¢é§åéçºïŒBDDïŒãã¬ãŒã ã¯ãŒã¯ãçµã¿èŸŒã¿ã®ã¢ãã¯æ©èœãšã¢ãµãŒã·ã§ã³æ©èœãå«ãŸããŠããŸãã
- CypressïŒ äž»ã«ãšã³ãããŒãšã³ãã®ãã¹ãããŒã«ã§ãããCypressã¯ReactãVueãªã©ã®äžéšã®ãã¬ãŒã ã¯ãŒã¯ã§ã³ã³ããŒãã³ããã¹ãã«ã䜿çšã§ããŸããèŠèŠçã§ã€ã³ã¿ã©ã¯ãã£ããªãã¹ãäœéšãæäŸããŸãã
äŸïŒJestãšReactïŒïŒ
åçŽãªReactã³ã³ããŒãã³ãããããšããŸãã
// src/components/Greeting.js
import React from 'react';
function Greeting({ name }) {
return <h1>Hello, {name}!</h1>;
}
export default Greeting;
Jestã䜿çšããŠåé¢ããããŠããããã¹ããäœæããæ¹æ³ã次ã«ç€ºããŸãã
// src/components/Greeting.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import Greeting from './Greeting';
test('renders a greeting with the provided name', () => {
render(<Greeting name="World" />);
const greetingElement = screen.getByText(/Hello, World!/i);
expect(greetingElement).toBeInTheDocument();
});
2. äŸåé¢ä¿ã®ã¢ãã¯ãšã¹ã¿ã
ã¢ãã¯ãšã¹ã¿ãã¯ããã¹ãäžã«ã³ã³ããŒãã³ããåé¢ããããã®äžå¯æ¬ ãªææ³ã§ããã¢ãã¯ã¯ãå®éã®äŸåé¢ä¿ã眮ãæããã·ãã¥ã¬ãŒãããããªããžã§ã¯ãã§ããããã®åäœãå¶åŸ¡ããã³ã³ããŒãã³ããæ£ããçžäºäœçšããããšã確èªã§ããŸããã¹ã¿ãã¯ãç¹å®ã®åŒã³åºãã«å¯ŸããŠäºåå®çŸ©ãããå¿çãæäŸããäŸåé¢ä¿ã®ç°¡ç¥åãããããŒãžã§ã³ã§ãã
ã¢ãã¯ãšã¹ã¿ãã®äœ¿ãåãïŒ
- ã¢ãã¯ïŒ ã³ã³ããŒãã³ããç¹å®ã®äŸåé¢ä¿ãç¹å®ã®æ¹æ³ã§ïŒç¹å®ã®åŒæ°ã䜿çšããããç¹å®ã®åæ°ã§ïŒåŒã³åºãããšã確èªããå¿ èŠãããå Žåã¯ãã¢ãã¯ã䜿çšããŸãã
- ã¹ã¿ãïŒ ã€ã³ã¿ã©ã¯ã·ã§ã³ã®è©³çްã確èªããã«ãäŸåé¢ä¿ã®æ»ãå€ãŸãã¯åäœãå¶åŸ¡ããã ãã§ããå Žåã¯ãã¹ã¿ãã䜿çšããŸãã
ã¢ãã¯æŠç¥ïŒ
- æåã¢ãã¯ïŒ JavaScriptã䜿çšããŠã¢ãã¯ãªããžã§ã¯ããæåã§äœæããŸãããã®ã¢ãããŒãã¯ãæãå¶åŸ¡ãæäŸããŸãããè€éãªäŸåé¢ä¿ã§ã¯æéããããå¯èœæ§ããããŸãã
- ã¢ãã¯ã©ã€ãã©ãªïŒ Sinon.JSãJestã®çµã¿èŸŒã¿ã¢ãã¯æ©èœãªã©ã®å°çšã¢ãã¯ã©ã€ãã©ãªãå©çšããŸãããããã®ã©ã€ãã©ãªã¯ãã¢ãã¯ãäœæããã³ç®¡çããããã®äŸ¿å©ãªã¡ãœãããæäŸããŸãã
- äŸåæ§æ³šå ¥ïŒ ã³ã³ããŒãã³ããäŸåé¢ä¿ãåŒæ°ãšããŠåãå ¥ããããã«èšèšããŠããã¹ãäžã«ã¢ãã¯ãæ³šå ¥ããããããŸãã
äŸïŒJestã䜿çšããAPIåŒã³åºãã®ã¢ãã¯ïŒïŒ
// src/components/UserList.js
import React, { useState, useEffect } from 'react';
import { fetchUsers } from '../api';
function UserList() {
const [users, setUsers] = useState([]);
useEffect(() => {
fetchUsers().then(data => setUsers(data));
}, []);
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}
export default UserList;
// src/api.js
export async function fetchUsers() {
const response = await fetch('https://api.example.com/users');
const data = await response.json();
return data;
}
// src/components/UserList.test.js
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import UserList from './UserList';
import * as api from '../api'; // Import the API module
// Mock the fetchUsers function
jest.spyOn(api, 'fetchUsers').mockResolvedValue([
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Smith' },
]);
test('fetches and displays a list of users', async () => {
render(<UserList />);
// Wait for the data to load
await waitFor(() => {
expect(screen.getByText(/John Doe/i)).toBeInTheDocument();
expect(screen.getByText(/Jane Smith/i)).toBeInTheDocument();
});
// Restore the original implementation after the test
api.fetchUsers.mockRestore();
});
3. æç¢ºã§ç°¡æœãªãã¹ãã®äœæ
é©åã«èšè¿°ããããã¹ãã¯ãå¥å šãªã³ãŒãããŒã¹ãç¶æããã³ã³ããŒãã³ããæåŸ ã©ããã«åäœããããšãä¿èšŒããããã«äžå¯æ¬ ã§ããæç¢ºã§ç°¡æœãªãã¹ããäœæããããã®ãã¹ããã©ã¯ãã£ã¹ã次ã«ç€ºããŸãã
- AAAãã¿ãŒã³ïŒArrange, Act, AssertïŒã«åŸãïŒ ãã¹ãã3ã€ã®ç°ãªããã§ãŒãºã«æ§é åããŸãã
- ArrangeïŒ ãã¹ãç°å¢ãã»ããã¢ããããå¿ èŠãªããŒã¿ãæºåããŸãã
- ActïŒ ãã¹ã察象ã®ã³ãŒããå®è¡ããŸãã
- AssertïŒ ã³ãŒããæåŸ ã©ããã«åäœããããšã確èªããŸãã
- 説æçãªãã¹ãåãæžãïŒ ãã¹ã察象ã®ã³ã³ããŒãã³ããšæåŸ ãããåäœãæç¢ºã«ç€ºããæç¢ºã§èª¬æçãªãã¹ãåã䜿çšããŸããããšãã°ããæå®ãããååã§æ£ããæšæ¶ã衚瀺ããå¿ èŠããããã¯ãããã¹ã1ããããæ å ±éãå€ããªããŸãã
- ãã¹ãã«éäžããïŒ åãã¹ãã¯ãã³ã³ããŒãã³ãã®æ©èœã®åäžã®åŽé¢ã«çŠç¹ãåœãŠãå¿ èŠããããŸããè€æ°ã®ã·ããªãªãäžåºŠã«ã«ããŒãããã¹ãã¯é¿ããŠãã ããã
- ã¢ãµãŒã·ã§ã³ã广çã«äœ¿çšããïŒ æåŸ
ãããåäœãæ£ç¢ºã«æ€èšŒããããã«ãé©åãªã¢ãµãŒã·ã§ã³ã¡ãœãããéžæããŸããå¯èœãªå Žåã¯åžžã«ç¹å®ã®ã¢ãµãŒã·ã§ã³ã䜿çšããŸãïŒããšãã°ã
expect(element).toBeVisible()ã®ä»£ããã«expect(element).toBeTruthy()ïŒã - éè€ãé¿ããïŒ äžè¬çãªãã¹ãã³ãŒããåå©çšå¯èœãªãã«ããŒé¢æ°ã«ãªãã¡ã¯ã¿ãªã³ã°ããŠãéè€ãæžãããä¿å®æ§ãåäžãããŸãã
4. ãã¹ãé§åéçºïŒTDDïŒ
ãã¹ãé§åéçºïŒTDDïŒã¯ãå®éã®ã³ãŒããèšè¿°ãã*åã«*ãã¹ããèšè¿°ãããœãããŠã§ã¢éçºããã»ã¹ã§ãããã®ã¢ãããŒãã«ãããããåªããã³ãŒãèšèšãæ¹åããããã¹ãã«ãã¬ããžãããã³ãããã°æéã®ççž®ã«ã€ãªããå¯èœæ§ããããŸãã
TDDãµã€ã¯ã«ïŒRed-Green-RefactorïŒïŒ
- RedïŒ ã³ãŒããååšããªãããã倱æãããã¹ããäœæããŸãã
- GreenïŒ ãã¹ãã«åæ Œããããã«å¿ èŠãªæå°éã®ã³ãŒããäœæããŸãã
- RefactorïŒ ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãæ§é ãšèªã¿ããããåäžãããªããããã¹ãŠã®ãã¹ããåŒãç¶ãåæ Œããããšã確èªããŸãã
TDDã®æ¡çšã¯é£ããå ŽåããããŸãããé«å質ã®ã³ã³ããŒãã³ããæ§ç¯ããããã®åŒ·åãªããŒã«ã«ãªããŸãã
5. ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒ
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã¯ã倿Žãå ±æãªããžããªã«ã³ãããããããã³ã«ãã³ãŒããèªåçã«ãã«ãããã³ãã¹ããããã©ã¯ãã£ã¹ã§ããã³ã³ããŒãã³ããã¹ããCIãã€ãã©ã€ã³ã«çµ±åããããšã¯ã倿Žã«ãã£ãŠãªã°ã¬ãã·ã§ã³ãçºçããªãããã«ããã³ãŒãããŒã¹ãå¥å šãªç¶æ ãç¶æããããã«äžå¯æ¬ ã§ãã
CIã®å©ç¹ïŒ
- ãã°ã®æ©ææ€åºïŒ ãã°ã¯éçºãµã€ã¯ã«ã®æ©ã段éã§æ€åºããããããæ¬çªç°å¢ã«ç§»è¡ããã®ãé²ããŸãã
- èªååããããã¹ãïŒ ãã¹ãã¯èªåçã«å®è¡ãããããã人çºçãã¹ã®ãªã¹ã¯ã軜æžãããäžè²«ãããã¹ãå®è¡ãä¿èšŒãããŸãã
- ã³ãŒãå質ã®åäžïŒ CIã¯ã倿Žã«é¢ãã峿ã®ãã£ãŒãããã¯ãæäŸããããšã«ãããéçºè ãããåªããã³ãŒããäœæããããã«ä¿ããŸãã
- ããè¿ éãªãªãªãŒã¹ãµã€ã¯ã«ïŒ CIã¯ããã«ãããã¹ããããã³ãããã€ã¡ã³ããèªååããããšã«ããããªãªãŒã¹ããã»ã¹ãåçåããŸãã
äžè¬çãªCIããŒã«ïŒ
- JenkinsïŒ ãœãããŠã§ã¢ã®ãã«ãããã¹ããããã³ãããã€ã«äœ¿çšã§ãããªãŒãã³ãœãŒã¹ã®èªååãµãŒããŒã
- GitHub ActionsïŒ GitHubãªããžããªã«çŽæ¥çµ±åãããCI/CDãã©ãããã©ãŒã ã
- GitLab CIïŒ GitLabãªããžããªã«çµ±åãããCI/CDãã©ãããã©ãŒã ã
- CircleCIïŒ æè»ã§ã¹ã±ãŒã©ãã«ãªãã¹ãç°å¢ãæäŸããã¯ã©ãŠãããŒã¹ã®CI/CDãã©ãããã©ãŒã ã
6. ã³ãŒãã«ãã¬ããž
ã³ãŒãã«ãã¬ããžã¯ããã¹ãã«ãã£ãŠã«ããŒãããŠããã³ãŒãããŒã¹ã®å²åãæž¬å®ããã¡ããªãã¯ã§ãããã¹ãã®å質ãå®å šã«æž¬ããã®ã§ã¯ãããŸãããããã¹ããäžååãªå¯èœæ§ã®ããé åã«é¢ãã貎éãªæŽå¯ãæäŸã§ããŸãã
ã³ãŒãã«ãã¬ããžã®çš®é¡ïŒ
- ã¹ããŒãã¡ã³ãã«ãã¬ããžïŒ ãã¹ãã«ãã£ãŠå®è¡ãããã³ãŒãå ã®ã¹ããŒãã¡ã³ãã®å²åãæž¬å®ããŸãã
- ãã©ã³ãã«ãã¬ããžïŒ ãã¹ãã«ãã£ãŠå®è¡ãããã³ãŒãå ã®ãã©ã³ãã®å²åãæž¬å®ããŸãïŒäŸïŒif/elseã¹ããŒãã¡ã³ãïŒã
- 颿°ã«ãã¬ããžïŒ ãã¹ãã«ãã£ãŠåŒã³åºãããã³ãŒãå ã®é¢æ°ã®å²åãæž¬å®ããŸãã
- è¡ã«ãã¬ããžïŒ ãã¹ãã«ãã£ãŠå®è¡ãããã³ãŒãå ã®è¡ã®å²åãæž¬å®ããŸãã
ã³ãŒãã«ãã¬ããžããŒã«ã®äœ¿çšïŒ
å€ãã®ãã¹ããã¬ãŒã ã¯ãŒã¯ã¯ãçµã¿èŸŒã¿ã®ã³ãŒãã«ãã¬ããžããŒã«ãæäŸããããIstanbulãªã©ã®å€éšããŒã«ãšçµ±åããŸãããããã®ããŒã«ã¯ãã³ãŒãã®ã©ã®éšåããã¹ãã§ã«ããŒãããŠããããã©ã®éšåãã«ããŒãããŠããªããã瀺ãã¬ããŒããçæããŸãã
éèŠãªæ³šæïŒ ã³ãŒãã«ãã¬ããžã¯ããã¹ãäœæ¥ã®å¯äžã®çŠç¹ã«ããªãã§ãã ãããé«ãã³ãŒãã«ãã¬ããžãç®æããŸãããã³ã³ããŒãã³ãã®ã³ã¢æ©èœãæ€èšŒããæå³ã®ãããã¹ããäœæããããšãåªå ããŸãã
ã°ããŒãã«ããŒã ã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ã«åæ£ããããŒã ã§äœæ¥ããå Žåã广çãªã³ãã¥ãã±ãŒã·ã§ã³ãšã³ã©ãã¬ãŒã·ã§ã³ã¯ãã³ã³ããŒãã³ããã¹ããæåãããããã«äžå¯æ¬ ã§ããèæ ®ãã¹ããã¹ããã©ã¯ãã£ã¹ã次ã«ç€ºããŸãã
- æç¢ºãªã³ãã¥ãã±ãŒã·ã§ã³ãã£ãã«ã確ç«ããïŒ SlackãMicrosoft TeamsããŸãã¯é»åã¡ãŒã«ãªã©ã®ããŒã«ã䜿çšããŠãã³ãã¥ãã±ãŒã·ã§ã³ãä¿é²ããããŒã ã¡ã³ããŒãäºãã«ç°¡åã«é£çµ¡ã§ããããã«ããŸãã
- ãã¹ãæŠç¥ãšèŠåãææžåããïŒ ããŒã ã®ãã¹ãæŠç¥ãèŠåãããã³ãã¹ããã©ã¯ãã£ã¹ãæŠèª¬ããå æ¬çãªããã¥ã¡ã³ããäœæããŸããããã«ãããå šå¡ãåãèªèãæã¡ãã³ãŒãããŒã¹å šäœã§äžè²«æ§ãä¿é²ãããŸãããã®ããã¥ã¡ã³ãã¯ãç°¡åã«ã¢ã¯ã»ã¹ã§ãã宿çã«æŽæ°ããå¿ èŠããããŸãã
- ããŒãžã§ã³ç®¡çã·ã¹ãã ïŒäŸïŒGitïŒã䜿çšããïŒ ããŒãžã§ã³ç®¡çã¯ãã³ãŒãã®å€æŽã管çããã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ããããã«äžå¯æ¬ ã§ããã³ãŒãå質ãç¶æããããã«ãæç¢ºãªãã©ã³ãæŠç¥ãšã³ãŒãã¬ãã¥ãŒããã»ã¹ã確ç«ããŸãã
- ãã¹ããšãããã€ã¡ã³ããèªååããïŒ CI/CDããŒã«ã䜿çšããŠããã¹ããšãããã€ã¡ã³ãããã»ã¹ãå¯èœãªéãèªååããŸããããã«ããã人çºçãã¹ã®ãªã¹ã¯ã軜æžãããäžè²«ãããªãªãŒã¹ãä¿èšŒãããŸãã
- ã¿ã€ã ãŸãŒã³ã®éããèæ ®ããïŒ äŒè°ã®ã¹ã±ãžã¥ãŒã«ãã¿ã¹ã¯ã®å²ãåœãŠãè¡ãéã¯ãã¿ã€ã ãŸãŒã³ã®éãã«æ³šæããŠãã ãããäžæãæå°éã«æããããã«ãå¯èœãªå Žåã¯åžžã«éåæéä¿¡æ¹æ³ã䜿çšããŸããããšãã°ããªã¢ã«ã¿ã€ã ã§ã®ã³ã©ãã¬ãŒã·ã§ã³ãå¿ èŠãšããã®ã§ã¯ãªããè€éãªãã¹ãã·ããªãªã®ãããªãŠã©ãŒã¯ã¹ã«ãŒãèšé²ããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ãšç¥èã®å ±æã奚å±ããïŒ ããŒã å ã®ã³ã©ãã¬ãŒã·ã§ã³ãšç¥èã®å ±æã®æåãè²ã¿ãŸããããŒã ã¡ã³ããŒããäºãã«ãã¹ãã®çµéšããã¹ããã©ã¯ãã£ã¹ãå ±æããããšã奚å±ããŸãã宿çãªç¥èå ±æã»ãã·ã§ã³ã®éå¬ããå éšããã¥ã¡ã³ããªããžããªã®äœæãæ€èšããŠãã ããã
- å ±æãã¹ãç°å¢ã䜿çšããïŒ æ¬çªç°å¢ãå¯èœãªéãå¿ å®ã«è€è£œããå ±æãã¹ãç°å¢ã䜿çšããŸãããã®äžè²«æ§ã«ãããäžäžèŽãæå°éã«æãããããã¹ããå®éã®ç¶æ³ãæ£ç¢ºã«åæ ããããšãä¿èšŒãããŸãã
- åœéåïŒi18nïŒãšããŒã«ãªãŒãŒã·ã§ã³ïŒl10nïŒã®ãã¹ãïŒ ã³ã³ããŒãã³ããç°ãªãèšèªãšå°åã§æ£ãã衚瀺ãããããšã確èªããŸããããã«ã¯ãæ¥ä»åœ¢åŒãé貚èšå·ãããã³ããã¹ãã®æ¹åã®ãã¹ããå«ãŸããŸãã
äŸïŒi18n/l10n ãã¹ã
æ¥ä»ã衚瀺ããã³ã³ããŒãã³ããæ³åããŠã¿ãŠãã ãããã°ããŒãã«ããŒã ã¯ãæ¥ä»ãããŸããŸãªãã±ãŒã«ã§æ£ãã衚瀺ãããããšã確èªããå¿ èŠããããŸãã
æ¥ä»åœ¢åŒãããŒãã³ãŒãã£ã³ã°ãã代ããã«ãåœéåããµããŒãããdate-fnsã®ãããªã©ã€ãã©ãªã䜿çšããŸãã
//Component.js
import { format } from 'date-fns';
import { enUS, fr } from 'date-fns/locale';
const DateComponent = ({ date, locale }) => {
const dateLocales = {en: enUS, fr: fr};
const formattedDate = format(date, 'PPPP', { locale: dateLocales[locale] });
return <div>{formattedDate}</div>;
};
export default DateComponent;
次ã«ãããŸããŸãªãã±ãŒã«ã§ã³ã³ããŒãã³ããæ£ããã¬ã³ããªã³ã°ãããããšãæ€èšŒãããã¹ããäœæããŸãã
//Component.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import DateComponent from './Component';
test('renders date in en-US format', () => {
const date = new Date(2024, 0, 20);
render(<DateComponent date={date} locale="en"/>);
expect(screen.getByText(/January 20th, 2024/i)).toBeInTheDocument();
});
test('renders date in fr format', () => {
const date = new Date(2024, 0, 20);
render(<DateComponent date={date} locale="fr"/>);
expect(screen.getByText(/20 janvier 2024/i)).toBeInTheDocument();
});
ããŒã«ãšãã¯ãããžãŒ
ãã¹ããã¬ãŒã ã¯ãŒã¯ä»¥å€ã«ããã³ã³ããŒãã³ããã¹ãã«åœ¹ç«ã€ããŸããŸãªããŒã«ãšãã¯ãããžãŒããããŸãã
- StorybookïŒ ã³ã³ããŒãã³ããåé¢ããŠéçºããã³ãã¹ãã§ããUIã³ã³ããŒãã³ãéçºç°å¢ã
- ChromaticïŒ Storybookãšçµ±åãããããžã¥ã¢ã«ãã¹ãããã³ã¬ãã¥ãŒãã©ãããã©ãŒã ã
- PercyïŒ UIã®ããžã¥ã¢ã«ãªå€æŽããã£ããããã®ã«åœ¹ç«ã€ããžã¥ã¢ã«ãªã°ã¬ãã·ã§ã³ãã¹ãããŒã«ã
- Testing LibraryïŒ ãã¹ãã§UIã³ã³ããŒãã³ããã¯ãšãªããã³æäœããããã®ã·ã³ãã«ã§ã¢ã¯ã»ã¹å¯èœãªæ¹æ³ãæäŸããã©ã€ãã©ãªã®ã»ãããå®è£ ã®è©³çްã§ã¯ãªãããŠãŒã¶ãŒã®åäœã®ãã¹ããéèŠããŸãã
- React Testing LibraryãVue Testing LibraryãAngular Testing LibraryïŒ ããããReactãVueãããã³Angularã³ã³ããŒãã³ãããã¹ãããããã«èšèšããããTesting Libraryã®ãã¬ãŒã ã¯ãŒã¯åºæã®ããŒãžã§ã³ã
çµè«
åé¢ããããŠããããã¹ãã䜿çšããããã³ããšã³ãã³ã³ããŒãã³ããã¹ãã¯ãç¹ã«ã°ããŒãã«ã«åæ£ããããŒã ã®ã³ã³ããã¹ãã«ãããŠãå ç¢ã§ä¿¡é Œæ§ãé«ããä¿å®å¯èœãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããããã®éèŠãªæŠç¥ã§ãããã®èšäºã§æŠèª¬ãããŠããæŠç¥ãšãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãããŒã ã¯é«å質ã®ã³ãŒããäœæãããã°ãæ©æã«ãã£ããããåè¶ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããããã«ãªããŸããé©åãªãã¹ããã¬ãŒã ã¯ãŒã¯ãéžæããã¢ãã¯æè¡ãç¿åŸããæç¢ºã§ç°¡æœãªãã¹ããäœæãããã¹ããCI/CDãã€ãã©ã€ã³ã«çµ±åããããŒã å ã§ã³ã©ãã¬ãŒã·ã§ã³ãšç¥èå ±æã®æåãè²ãããšãå¿ããªãã§ãã ããããããã®ååãåãå ¥ããã°ãäžçã¯ã©ã¹ã®ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã®ã«åœ¹ç«ã¡ãŸãã
ç¶ç¶çãªåŠç¿ãšé©å¿ãéèŠã§ããããšãå¿ããªãã§ãã ãããããã³ããšã³ãã®ç¶æ³ã¯åžžã«é²åããŠãããããææ°ã®ãã¹ããã¬ã³ããšãã¯ãããžãŒãåžžã«ææ¡ããŠããã¹ãæŠç¥ã广çã§ããããšã確èªããŠãã ããã
ã³ã³ããŒãã³ããã¹ããåãå ¥ããå質ãåªå ããããšã§ãã°ããŒãã«ããŒã ã¯æ©èœçã§ããã ãã§ãªããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠæ¥œããã¢ã¯ã»ã¹ãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ããŸãã